#pragma once

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <stack>

#ifdef _USE_JSONCPP_
#include <jsoncpp/json.h>
using namespace Json;

typedef Json::Reader JsonReader_t;
typedef Json::Value  JsonValue_t;
typedef Json::StreamWriter JsonWriter_t;
typedef Json::CharReader JsonCharReader_t;
typedef Json::CharReaderBuilder JsonCharReaderBuilder_t;
typedef Json::StreamWriterBuilder JsonStreamWriterBuilder_t;
#else
#include "json/json.hpp"
using json = nlohmann::json;
using JsonValue_t = json;
#endif

using namespace std;

#include "topcvt_string.hpp"
#include "topcvt_logutil.hpp"
#include "topcvt_exception.hpp"
#include "topcvt_encoding.hpp"
#include "topcvt_object.hpp"

#include "pugixml/pugixml.hpp"

namespace topcvt
{
	class JsonHelper
	{
		static string m_encoding;
	public:
		static void setEncoding(const string& encoding);
		static int readJson(const string& jsonStr, JsonValue_t& oJsonDoc);
		static int writeJson(JsonValue_t& jsonDoc, string& oStrBuffer);
		static JsonValue_t& set(JsonValue_t& jsonNode, const string& key, const string& value);
		static JsonValue_t& set(JsonValue_t& jsonNode, const string& key, const JsonValue_t& value);
		static JsonValue_t& append(JsonValue_t& arrayNode, const JsonValue_t& value);
		static JsonValue_t& get(JsonValue_t& jsonNode, const string& key);
		static const JsonValue_t& get(JsonValue_t& arrayNode, int index);
		static string asString(const JsonValue_t& value);
		static bool isArray(const JsonValue_t& value);
		static bool isObject(const JsonValue_t& value);
		static bool isString(const JsonValue_t& value);
		static bool isNumber(const JsonValue_t& value);
		static bool isBoolean(const JsonValue_t& value);
		static bool isNull(const JsonValue_t& value);

		//! object <=> json
		static void fromJson(JsonValue_t& v, Object& object);
		static void toJson( Object& object, JsonValue_t& v);
		//! xml <=> json
		static void json2xml( JsonValue_t v, pugi::xml_node& xmlnode);
		static void xml2json( pugi::xml_node& node, JsonValue_t& v);
	};
};



